<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<meta name="robots" content="all">
<title>EQPHP开发手册-免费开源PHP-WEB项目开发框架应用指南</title>
<meta name="keywords" content="EQPHP，免费开源PHP-WEB项目开发框架，应用指南，使用手册，艺青联盟，快速建站">
<meta name="description" content="EQPHP,一款简单易用的、安全的、高效的php开源框架。TPS-MVC全分离式框架，由工具类、组件类、扩展库、业务逻辑层—数据模型层、视图层、控制层组成，重写常用函数、类库，整合Smarty的组件类，收集升级Web项目常用类，可根据功能需求自由扩展。本框架以类为单元，动静结合（静态类、设计模式型的组合群），功能强大（文件目录操作、异常日志追溯、缓存静态化、请求响应数据接收处理、DB操作等关键性技术）。结构简洁（单一入口、类加载+常用工具类+组件类）、体积极小（158KB），部署灵活，可任意调整，适合几乎所Web项目开发。">
<meta name="autor" content="art-youth_web">
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="text/javascript" src="jquery_17.js"></script>
<script type="text/javascript" src="index.js"></script>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
</head><body><div class="div_main">

<h1 class="h1_title"><span class="fal fs18 fcr">EQPHP开源中文WEB应用开发框架</span> <span class="far fs15"><a href="http://www.eqphp.com" title="点击进入EQPHP官方网站">官方网站</a> | <a href="http://bbs.eqphp.com/" title="点击进入EQPHP官方BBS交流专区">技术交流</a></span></h1>

<div class="nav_title">
<dl>
<dt>框架简介(Introduce)</dt>
<dd>1、关于EQPHP</dd>
<dd>2、在哪儿获取</dd>
<dd>3、基本安装配置</dd>
<dd>4、约束规范</dd>
<dd>5、简单的留言本案例</dd>
<dd>6、技术团队与社区</dd>
</dl>

<dl>
<dt>分封思想(TPS-MVC)</dt>
<dd>1、目录结构与说明</dd>
<dd>2、调用流程与执行原理</dd>
<dd>3、控制器详解</dd>
<dd>4、使用视图</dd>
<dd>5、业务逻辑与数据模型</dd>
<dd>6、组件注册与应用</dd>
<dd>7、工具类、函数方法</dd>
</dl>

<dl>
<dt>细节技巧(Skills)</dt>
<dd>1、数据库使用</dd>
<dd>2、请求与响应</dd>
<dd>3、表单处理与数据安全</dd>
<dd>4、文件操作</dd>
<dd>5、cookie与session</dd>
<dd>6、缓存、静态化</dd>
<dd>7、加密、图像、邮件…</dd>
<dd>8、日志、性能、错误调试</dd>
<dd></dd>
</dl>

<dl>
<dt>扩展应用(Extends)</dt>
<dd>1、ORM技术</dd>
<dd>2、模板引擎</dd>
<dd>3、图像、图表</dd>
<dd>4、上传下载</dd>
<dd>5、API相关</dd>
<dd>6、数据传输安全SSL</dd>
<dd>7、多语言化界面实现</dd>
<dd>8、分词与搜索</dd>
</dl>

<dl>
<dt>性能优化(Optimizing)</dt>
<dd>1、分库、分表与SQL缓存</dd>
<dd>2、IO开销与平衡</dd>
<dd>3、继承与解耦</dd>
<dd>4、排序与算法</dd>
<dd>5、组件及前端优化</dd>
<dd>6、性能与维护扩展之平衡</dd>
</dl>
</div>

<div class="main">

<h1>EQPHP简介</h1>
<p>

<img src="images/eqphp.png" align="center"><span class="fsb fs18 fcbb">　　欢迎使用 EQPHP</span><br><br>

<strong>EQPHP是什么？</strong><br>EQPHP,一款超简单易用的、安全的、高效的php开源框架。它是一款基于面向对象的TPS-MVC全分离式框架，由工具类、组件类、业务逻辑层—数据模型层、视图层、控制层组成，重写常用函数、类库，整合Smarty的组件类，收集升级Web项目常用类，可根据功能需求自由扩展。本框架以类为单元，动静结合（静态类、设计模式型的组合群），功能强大（文件目录操作、异常日志追溯、缓存静态化、请求响应数据接收处理、DB操作等关键性技术）。结构简洁（单一入口、自动加载）、体积极小（158KB），部署灵活，可任意调整，适合几乎所有Web项目开发。<br><br>

<strong>EQPHP在同行业、同领域有什么独到之处？</strong><br>
1、免费开源：遵循Apache2开源协议发布，意味着你不但可以免费使用，甚至允许把你基于EQPHP开发的应用开源或商业产品发布、销售。<br>
2、小巧易用，无需学习：本框架除工具类外仅剩类文件自动加载和MVC层次结构。<br>
3、文档齐全，资源广泛，社区活跃，你可以随时活的帮助和疑难解答，也可以分享自己的心得与经验。
</p>




<h1>在哪儿可以获取EQPHP？</h1>
<p><br>
<strong>官方下载地址：</strong><br>
zip 压缩包：<a href="http://www.eqphp.com/download/framework_v1.0.zip" title="点击下载EQPHP 1.0压缩包">http://www.eqphp.com/download/framework_v1.0.zip</a><br>
tar 压缩包：<a href="http://www.eqphp.com/download/framework_v1.0.tar.gz" title="点击下载EQPHP 1.0压缩包">http://www.eqphp.com/download/framework_v1.0.tar.gz</a><br><br>

<strong>GitHub下载地址：</strong><br>
<a href="https://github.com/eqphp/framework" title="EQPHP 1.0 github 下载">https://github.com/eqphp/framework</a><br><br>

<strong>Google code SVN下载地址：</strong><br>
<a href="http://eqphp-framework.googlecode.com/svn/" title="EQPHP 1.0 github 下载">http://eqphp-framework.googlecode.com/svn/</a><br><br>

<strong>其它下载地址：</strong><br>
CSDN：<a href="http://download.csdn.net/detail/u012655415/6497077" title="EQPHP 1.0 csdn 下载">http://download.csdn.net/detail/u012655415/6497077</a><br><br>
</p>

<h1>安装与配置</h1>
<p>
<strong>运行环境要求：</strong>
Linux(Lamp)、Windows-IIS或Windows(Wamp)平台，PHP5.3以上版本，apache2.2<br><br>
<strong>Wamp平台安装方法：</strong><br>
wamp环境下非常简单，直接解压缩包，将解压后的www目录里的内容复制到web的www目录（或htdocs）下即可完成安装。<br><br>
<strong>Lamp平台安装方法：</strong><br>
将下载好的tar包解压到既定目录（如:/var/www/，命令：tar -xvf 下载包 /var/www）即可完成安装部署，直接访问URL：http://localhost/即可看到如下欢迎画面：<br>
<img src="images/eqphp_default_page.gif"><br>
OK，大功告成！
</p>


<h1>命名规范与相关约束</h1>
<p>说实话，你是不是很不情愿被约束，被习惯呢？或者说你的习惯已经很好了，自成风格，自有规范，其它的统统是异类……<br>
哈哈，不必担心，EQPHP只有一个约束须遵守(^-^ only one ！)：<br>
<span class="fsb"><strong class="fcr fsb">每个类名需前缀所在目录的小写首字母加下划线，且与文件名一致</strong>，如：a_index、m_user、s_command等等。</span><br><br>


<strong>推荐一套风格习俗：</strong><br>
<span>a、摈弃大写，全局常量前缀：dc_ (define constants的首字母)，如dc_root；</span><br>
<span>b、采用下划线式驼峰命名变量、函数名、类名、目录名，如$user_id、get_user_info()、p_page、news；</span><br>
<span>c、看到前两条很奇葩的风格是不是你已经猜到书者的意图（摈弃大写）了？是的，那么就用封装来kill掉遇到的大写，如$_SESSION可用session()方法，<br>&nbsp;&nbsp;&nbsp;&nbsp;$_POST可用post(),官方没有这些作为内置函数就是留给我们使用的，你猜的没错；</span><br>
<span>d、凡事不过三，开发也一样，嵌套（继承{接口、抽象、实现}、循环、条件判断、缩进(最好换行)……）最多三层，分方法处理多层嵌套，牺牲微末性能来提高代码可读性；</span><br>
<span>e、多考虑设计原则，少套用设计模式，以免过度开发；</span><br>
<span>f、一个模块只干该干的是，一个类只做该做的事、一个方法只实现最少的功能……</span><br><br>

</p>



<h1>案例：留言本</h1>
<p>说这么多，爱学的你是不是已经急了、烦了？，它到底能做啥？好使不？好吧，不说了，接下来我们来开发一个留言本。<br>
<strong><em class="fsi fcr">step 1</em>、先看需求规格：</strong><br><img src="images/message_book_used.gif"><br>

<strong><em class="fsi fcr">step 2</em>、设计效果图如下：</strong><br>
留言发表页面：<br>
<img src="images/pub_message_page.gif"><br><br>
管理员登陆页面：<br>
<img src="images/login_admin_page.gif"><br><br>
留言管理页面：<br>
<img src="images/manage_message_page.gif" width="900px"><br><br>


<strong><em class="fsi fcr">step 3</em>、切图、出静态页面：</strong><br>
<img src="images/view_page_list.gif"><br>

<strong><em class="fsi fcr">step 4</em>、设计数据库：</strong><br><img src="images/message_db_table.gif"><br>
<img src="images/admin_date_config.gif"><br><br>

<strong><em class="fsi fcr">step 5</em>、写程序，处理数据业务逻辑：</strong><br>
5-1、配置数据库信息，打开config目录下的db.ini文件，配置如下：<br>
<img src="images/eqphp_db_config.gif"><br><br>
5-2、开发留言发表功能（发表留言）。<br>
在action目录下创建一个名为a_message.php的php脚本文件，打开它写入如下代码:<br>
<img src="images/message_code_001.gif"><br>
5-3、开发留言查看功能（分页查看、筛选未读留言）。<br>
在action目录下创建一个名为a_manage.php的php脚本文件，打开它写入如下代码:<br>
<img src="images/message_code_002.gif"><br>
5-4、开发留言管理功能（标注已读、删除）。<br>
在action目录下创建一个名为a_act_manage.php的php脚本文件.<br><br>
5-5、开发权限功能（登录、查看、标注、删除）。<br>
在action目录下创建名为a_access.php、a_login.php的脚本文件.<br>
</p>

<h1>技术团队与社区</h1>
<p><br>
<strong>官方微信</strong><br><br>
<img src="images/eqphp_chart.png" title="EQPHP 官方微信"><br><br>

<strong>官方微博</strong><br><br>
<img src="images/sina_weibo_icon.gif" title="EQPHP 官方新浪微博">　<a href="">新浪微博</a>　　　<img src="images/qq_weibo_icon.gif" title="EQPHP 官方QQ微博">　<a href="">腾讯微博</a><br><br>

<strong>QQ技术群</strong><br><br>
EQPHP官方群：464221529、84683642<br>
EQPH PHP群：258122391<br>
EQPHP前端群：2448688735<br>
EQPHP组件扩展群：2394909507<br><br>

<strong>社区论坛：</strong><br><br>
Q & A：<a href="" title="EQPHP 疑问解决中心">http://ask.eqphp.com/</a><br>
BBS：<a href="" title="EQPHP 社区">http://bbs.eqphp.com/</a><br>
</p>


<h1>目录结构与说明</h1>
<p>
<img src="images/eqphp_directory_comment.jpeg"><br><br>
<span class="fsb fcr">备注：</span><br>
<strong>1、分组可有有多个，每个都有控制器和数据模型两个目录；</strong><br>
<strong>2、除一级目录外，其它的可自定义，详细参考config文件夹下的dir.ini文件；</strong><br>
<strong>3、日志(log)、文件(file)、数据(data)、视图(view)结构可以任意整合，此结构只做参考；</strong>
</p>




<h1>调用流程与执行原理</h1>
<p><br>
<strong>调用流程：</strong><br>
<img src="images/eqphp_frame_relation.gif"><br><br>

<strong>执行原理：</strong><br>
<img src="images/eqphp_execute_mechanism.gif"><br><br>

<span class="fsb fcr">备注：</span><br>
<strong>1、对于简单项目，可以不用分组；</strong><br>
<strong>2、多层级、多划分的目的是为了业务逻辑处理、数据加工更加简洁明了；</strong><br>
<strong>3、本样图只是常规应用的部署架构，对于具体项目可以自由修改。</strong>
</p>



<h1>控制器（action）</h1>
<p><br>
<strong>作用：</strong><br>
<span>1、接收用户请求、加工处理请求条件(如：post、get(或url片段)、协议等)；</span><br>
<span>2、根据请求（包括异步）参数，调用模型（model）所加工的数据或业务逻辑（server）处理结果，并赋值视图，加载渲染视图返回处理结果给用户；</span><br>
<span>3、处理控制器内部业务逻辑，完善并使得控制器高度自治。</span><br><br>

<strong>URL解析：</strong><br>
<span>传统url：{协议}://{二级域名}.{域名}/[分组/]{php脚本}?{get参数}。如：http://www.eqphp.com/news.php?action=del&id=8</span><br>
<span>分段路由(pathinfo)：{协议}://{二级域名或分组名}.{域名}/[分组/]{控制器}/{方法}/{参数}。如：http://www.eqphp.com/admin/news/del/8</span><br>
<span>混合路由：{协议}://{二级域名}.{域名}/[分组/]{控制器}/{方法}/?{url片段}。如：http://www.eqphp.com/admin/news/del/?id=8&form=admin#lay_3
</span><br><br>

<strong>说明：</strong><br>
<span>1、本框架追求简洁，提倡采用流行的分段路由（<a href="" title="点击查看如何开启伪静态支持？">需要支持伪静态</a>），但不废除传统路由和混合路由；</span><br>
<span>2、每个控制器须有默认方法（即index），请求的url的方法不存在时自动跳转到index方法。当然也可自定义魔术方法__call()。</span><br>
<span>3、每个控制器目录下可有a_index.php控制器作为（该分组下的）默认控制器，当url中没有正确控制器时执行该默认控制器 <a href="">案例：controller</a>。</span><br>
<span>4、每个对外控制器方法可有一个(静态)或多个（非静态）形参，形参的值为：explode('/',dc_request)的结果。</span><br><br>

<strong>例外：</strong><br>
<span>1、对于静态控制器（不需要实例化），需要声明私有属性$static_class，<br>且对外访问的每个方法必须加static修饰，可用魔术方法__callStatic <a href="">案例：controller static</a>；</span><br>
<span>2、当控制器含有魔术方法__destruct时，慎用(exit、die)，以免程序运行出错 <a href="">案例：controller destruct</a>；</span><br>
<span>3、当控制器继承其它类时，父类和自身具有构造函数，需在自身构造器内首先调用父类构造器，以免父类构造器被重写<a href="">案例：controller construct</a>。</span><br><br>


<strong>案例（demo）</strong><br>
<span>case 1: controller<br>
<code>&lt;?php<br>
<i>//默认控制器</i><br>
class a_index{<br><br>
<i>/*<br>默认方法<br>访问：http://localhost/，即可看到Hello EQPHP !<br>*/</i><br>
function index(){<br>
echo 'Hello EQPHP !';<br>
}<br>

<br>
}
</code>
</span><br><br>

<span>case 2: controller static<br>
<code>&lt;?php<br>
<i>//静态控制器</i><br>
class a_test{<br><br>
private $static_class; <i>//声明为静态控制器</i><br><br>
<i>//输出：$500</i><br>
static function index(){<br>
echo self::get_money();<br>
}<br><br>

static private function get_money(){<br>
return '$500';<br>
}


<br><br>
}
</code>
</span><br><br>


<span>case 3: controller destruct<br>
<code>&lt;?php<br>

class a_demo{<br><br>

private $name;<br><br>

function __construct(){<br>
$this->name='demo';<br>
}<br><br>

<i>//输出：demo换行demo换行,不能输出de…</i><br>
function index(){<br>
<i>//http::out方法中有exit，导致__destruct不能正常执行</i><br>
http::out($this->name.'&lt;br&gt;'); <i>输出demo</i><br>
}<br><br>

<i>//清理垃圾</i><br>
function __destruct(){<br>
echo $this->name,'&lt;br&gt;'; <i>//输出demo</i><br>
<i>//不能输出de…（提示： Class 'fun' not found）</i><br>
echo fun::str_cut($this->name,2);<br>
unset($this->name);<br>
}


<br><br>
}
</code>
</span><br><br>


<span>case 4: controller construct<br>
<code>&lt;?php<br>

class a_fathor{<br>

protected $fathor='无名';<br><br>

function __construct(){<br>
$this->fathor='王五';<br>
}

<br><br>
}<br><br><br>



class a_son extends a_fathor{<br>

private $son;<br>

function __construct(){<br>
parent::__construct(); <i>//调用父构造函数，以免被重写</i><br>
$this->son='小明';<br>
}<br><br>

<i>//输出：小明的父亲是王五</i><br>
function index(){<br>
http::out($this->son.'的父亲是'.$this->fathor);<br>
}



<br><br>
}
</code>
</span><br><br>

</p>



<h1>视图（view）</h1>
<p><br>
<strong>作用意义：</strong><br>
<span>1、分离，将php与html（后端和前端）相分离，使得程序更简洁，更易读懂，程序员与美工各自同时作业，互不干扰；</span><br>
<span>2、包装，将控制器“分发”的 数据 按照用户（浏览者）最能“理解”的样子呈现给用户，结合样式表css更好的包装产品（数据）；</span><br>
<span>3、专一，“格式化”数据、收集用户信息（表单）给控制器，为浏览者提供良好视觉界面，使得产品易维护、再开发，进而提升用户体验。</span><br><br>


<strong>视图片段与视图（页面）整合：</strong><br>
通常我们所看到的一个页面就是一个完整html文件(dom树)，浏览器渲染的结果是：一小块一小块合成一个页面。如页眉、logo、banner导航条、左栏、中间主体、版权信息等等，甚至更多，这样我们就会发现有些页面的好多地方很相似（甚至相同），若重复的写（或复制粘贴）很浪费时间，也不好维护，这时给代码分块（即视图分块）就显得至关重要了。<br>
组件（相似区域）与加载块（相同区域）是我们整合视图时常用的手法。<a href="">案例：view plugin</a><br><br>


<span>case 1: view plugin<br>
<code>

<i>&lt;!--组件：网页元信息--&gt;</i><br>
{head css='basic|manage' js="style|manage" out_js="static/jquery_17"}<br><br>

<i>&lt;!--代码块：页眉--&gt;</i><br>
{include file="{$dir.view}header.tpl"}<br><br>

<i>&lt;!--代码块：导航条--&gt;</i><br>
{include file="{$dir.view}nav.tpl"}<br><br><br>


&lt;div class="content"&gt;<br>

<i>&lt;!--组件：侧边栏主题新闻--&gt;</i><br>
{news_list theme="php" num=10}<br><br>

&lt;div class="main"&gt;<br><b class="fcrr">本页的主要内容</b><br>……<br>&lt;/div&gt;<br><br>

&lt;/div&gt;<br><br><br>

<i>&lt;!--代码块：页脚--&gt;</i><br>
{include file="{$dir.view}footer.tpl"}

</code>
</span><br><br>


</p>



<h1>模型（model）与业务逻辑（server）</h1>
<p><br>
<strong>模型：</strong><br>
通常我们会碰到：数据库一张表（关系比较复杂的表）若有变动，我们就得逐一扫描所有程序并修改与这张表相关的地方，变动稍大，修改、测试工作量大的要命。还有，你是不是常常发现我们项目的安全问题往往出在数据库上，比如，由于验证不力让人恶意写入危险字符，数据库爆满、数据泄露等等。你可能会问这与模型有和关系呢？当然有，调查发现：未采用MVC的模式项目通常易被攻击，想想看，把所有的事情混在一起，让大伙都来干预，这样是不是容易出现纰漏。<br>
鉴于上述，模型就显得至关重要了。你可能已经理解了：模型就数据模型，就是建立在控制器与数据库之间的一个关系层。用来隔离控制层直接与数据库打交道，保证数据安全出入（CURD）数据库，维持资源的调度与程序的稳定性。<br><br>


<strong>EQPHP如何创建一个模型类？</strong><br>
很简单，我们只需要创建一个m_模型名的php文件，且内容是一个m_模型名的类，然后放入相应分组（模块）的model里就OK了，如下，案例：model<br>
case:model<br>
<code>

&lt;?php<br><br>

class m_news{<br><br>

<i>/**<br>
【news】新闻数据模型<br>
1、获取指定数目的新闻<br>
2、获取指定新闻详情<br>
3、删除指定新闻<br>
4、添加新闻<br>
5、修改指定新闻<br>
**/</i><br><br>

const news='news';<br><br>

<i>//获取指定数目的新闻</i><br>
static function get_list($mode=false,$num=10){<br>
$option['select']='id,title,pub_time';<br>
$option['from']=self::news;<br>
$option['where']='is_show=1';<br>
$option['order']=$mode ? 'visited_num desc id desc' : 'id desc';<br>
$option['limit']='0,'.$num;<br>
return db::rs_list(sql($option));<br>
}<br><br>

<i>//获取指定新闻详情</i><br>
static function get_detail($news_id){<br>
$select='id,title,description,content,pub_time,visited_num';<br>
$condition='is_show=1 &&'.$news_id;<br>
return db::rs(sql($select,self::news,$condition));<br>
}<br><br>


<i>//删除新闻</i><br>
static function del($news_id){<br>
if (strpos($news_id,',')) {<br>
$news_id='id in('.$news_id.')';<br>
}<br>
return db::del(self::news,$news_id);<br>
}<br><br>


<i>//添加新闻</i><br>
static function add($data){<br>
return db::add(self::news,$data);<br>
}<br><br>


<i>//修改新闻</i><br>
static function mod($data){<br>
if (isset($data['news_id'])) {<br>
$news_id=$data['news_id'];<br>
unset($data['news_id']);<br>
return db::mod(self::news,$data,$news_id);<br>
}<br>
}<br><br>

}


</code><br><br>


<strong>业务逻辑：</strong><br>
开发中我们经常会遇到一大堆与数据库没有关系、与控制器没有关系的逻辑算法，比如对数据记录排序、计算统计结果等等。<br>
对业务逻辑层，EQPHP推荐以下几种场景可以考虑：<br>
a、需要跨模块（分组）调用的数据模型（如访问统计）可写在业务逻辑层；<br>
b、纯数据计算、数据转换；<br>
c、全局使用的业务逻辑代码，如登录验证；<br>
d、似组件，但做成组件不好使用，如分页导航条。<br><br>


<strong>EQPHP如何创建一个业务逻辑类？</strong><br>
创建一个s_业务名的php文件，且内容是一个s_业务名的类，然后放入相应server里就OK了，如下，案例：server<br>
case:model<br>
<code>

&lt;?php<br><br>

class s_table{<br><br>

<i>//定义表前缀</i><br>
const table_prefix='eqphp_';<br><br>

<i>//定义全站数据表</i><br>
static $table=array(<br>
<i>//会员模块</i><br>
'u_user'=>'user',<br>
'u_info'=>'user_basic_info',<br>
'u_login'=>'user_login_log',<br>
'u_register'=>'user_register_log',<br>
'u_point_log'=>'user_point_log',<br><br>

<i>//新闻模块</i><br>
'n_new'=>'news',<br>
'n_class'=>'news_class',<br>
'n_comment'=>'news_comment',<br>
);<br><br>

<i>//加前缀</i><br>
static function table($name){<br>
if (in_array($name,array_keys(self::$table))) {<br>
return self::table_prefix.self::$table[$name];<br>
}<br><br>

exit('Undefined table reflection: '.$name);<br>
}<br><br><br>



}<br>

</code><br><br>


<strong>总结分析：</strong><br>
呵呵，聪明的你应该明白了：<br>
1、模型与业务呈阴阳，功能调度互补，模型主私、处理局部(模块分组)，业务主公、掌控全局；<br>
2、模型紧紧与数据库打交道，业务逻辑只有一个，可替代模型；<br>
3、两者在实际开发中均可不用（看实际情况，很免强）。
</p>




<h1>组件（plugin）</h1>
<p><br>
<strong>什么是组件？</strong><br>
组件，也称插件，即能够独立完成某项特定功能的程序体。EQPHP将组件分为动态组件（需要PHP程序支持）和静态组件（即前端插件），如天气预报组件、财经指数组件、日历插件等等。<br>
EQPHP目前使用开源smarty模板整合视图，将smarty组件用法进行扩展，使其与整个框架相融合。常用组件有：function、modify、block三项。<br><br>

<strong>应用场景：</strong><br>
a、系统项目中孤立（或多处使用）单元（不受系统或周围环境的影响），如导航条、页脚等；<br>
b、经常性使用的功能代码，如消息发送时间加工器、颜色选择器、文件上传面板等；<br>
c、记录集循环输出中某项数据加工修饰，如工资清单中根据职位不同显示不同颜色，以便区分。<br><br>


<strong>使用方法：</strong><br>
step 1、创建组件：建一个p_组件名的php文件，且内容是一个p_组件名的类，然后放入plugin目录；<br>
step 2、注册组件：到配置目录找到系统配置文件config.ini，打开找到组件项，根据组件类型将组件名添加到响应项；<br>
step 3、组件模板：到视图目录制作组件数据样式模板，即html代码片段；<br>
step 4、调用组件：到目标视图使用smarty组件调用方法调用。<a href="">案例：case plugin</a><br><br>
case plugin(p_menu.php)<br>
<code>
&lt;?php<br><br>

<i>
/**<br>
【菜单】function组件<br>
1、导航条<br>
2、二级导航面板<br>
3、页脚帮组导航<br>
**/</i><br><br>

class p_menu{<br><br>

<i>//项目导航条</i><br>
static function top_nav($params,$tpl){<br>
$data['now_category']=isset($params['now_category']) ? $params['now_category'] : 'index';<br>
$data['category']=config('top_nav','menu');<br>
return tpl::show('plugin/top_nav',$data,$tpl);<br>
}<br><br>

<i>//二级导航面板</i><br>
static function left_menu($params,$tpl){<br>
$category=isset($params['category']) ? $params['category'] : 'index';<br>
$data['info']=config($category,'left_menu');<br>
return tpl::show('plugin/left_menu',$data,$tpl);<br>
}<br><br>

<i>//页脚帮助导航</i><br>
static function help_menu($params,$tpl){<br>
$data['now_option']=isset($params['now_option']) ? $params['now_option'] : 'contact';<br>
$data['option']=config('help_menu','menu');<br>
return tpl::show('plugin/help_menu',$data,$tpl);<br>
}<br><br>


}<br>

</code><br><br>

config.ini<br>
<code>
……<br><br>
[plugin]<br>
function=p_fun,p_page<br>
modifier=p_mod,<span class="fcr">p_menu</span><br>
<i>; block=p_block</i><br><br>

……<br>
</code><br><br>


menu.ini<br>
<code>
[top_nav]<br>
index=首页<br>
about=关于我们<br>
producr=产品展示<br>
server=服务项目<br>
news=新闻资讯<br>
contact=联系方式<br><br>


[help_menu]<br>
contact=联系方式<br>
help=使用指南<br>
site_map=网站地图<br>
job=招贤纳士<br>
weibo=官方微博<br>
message=留言建议<br>

</code><br><br>

top_nav.html<br>
<code>
&lt;div class="top_nav"&gt;<br>
&lt;ol&gt;{foreach key=option item=name from=$category}<br>
&lt;li{if $now_category eq $name} class="now_option"{/if}>&lt;a href="{$url}{$option}"&gt;{$name}&lt;/a&gt;&lt;/li&gt;<br>
{/foreach}&lt;/ol&gt;<br>
&lt;/div&gt;<br>
</code><br><br>

news.html<br>
<code>
……<br><br>
<i>&lt;!--调用导航组件--&gt;</i><br>
{top_nav now_category="news"}<br><br>
……<br>
</code><br><br>

<strong class="fcyy">Tip：</strong>组件类的对外（即视图中需要调用的）方法必须为全局、静态（即public static）性质。<br>

</p>



<h1>工具类（class）、函数方法（function_lib）</h1>
<p><br>
<strong>工具类（class）</strong><br>
做为项目开发中最小的数据加工、逻辑处理单元，工具类作用意义重大：<br>
1、层级最高，在哪儿都可以被调用（或继承），使用简单方便；<br>
2、可重复使用，不受环境影响，极大简化代码结构，使代码简洁易读；<br>
3、根据项目需求，可增可减，扩展性强。<br>
EQPHP将常用的函数方法根据其使用范畴采用单例、静态类（纯静态方法集合）、普通类等方式收集整合归类：如文件缓存类、数据库操作类、性能调试类、<br>
表单处理类、数组字符处理类、安全过滤类、请求响应类、邮件类、模板引擎类、文件类、日志类、图片处理类、session/cookie类…
<br><br>

<strong>使用方法：</strong><br>
1、作用域调用法（静态方法），如删除指定目录：<span class="fsb">file::del($file_dir)</span>，查询一个字段：<span class="fsb">db::field('member','email',8)</span>；<br>
2、对象标识符调用法，如多库查询：<span class="fsb">db('master')->rs_list(sql($option))</span>；<br>
3、常规使用方法：<span class="fsb">$cache->save($data)</span>。更多更具体用法参见：<a href="">附录Ⅱ 工具类一览表</a><br><br><br>


<strong>函数方法（function_lib）</strong><br>
函数方法包function_lib.php位于server目录下（当然你也可以将其移至你认为合理的地方），其存在意义：<br>
1、有些方法使用频率及其高，如：配置读取、SQL语句组装等，为了更方便的使用，将其写入函数方法包；<br>
2、从性能考虑，出于最少最快加载，将其写入函数方法包，如：获取pathinfo路由的参数。<br>
EQPHP不建议大量使用函数方法包式做法，考虑整个项目的开发、性能，请酌情使用。

</p>





<h1>数据库操作（DB）</h1>
<p><br>
<strong>单库操作</strong><br>

一、数据库连接配置，打开config/db.ini文件，配置如下：<br>
<code>
[server]<br>
host=主机IP<br>
port=端口号<br>
user=用户账号<br>
pwd=密码<br>
dbase=数据库<br>
names=字符集、编码<br><br>

[param]<br>
debug=SQL错误开关<br>
page_size=默认分页记录数
</code><br><br>

二、数据记录操作（CURD-read）-查询<br>
1、执行SQL语句：<span class="fsb">db::query('SQL语句')</span><br>
<code>
<i>//清空会员表：</i><br>
db::query('truncate member');<br><br>

<i>//删除临时访问日志表：</i><br>
db::query('drop table visited_log');
</code><br><br>

2、查询数据表指定字段值(点，返回一个单元格)：<span class="fsb">db::filed('表名','查询字段','条件')</span><br>
<code>
<i>//查询ID为8的新闻标题：</i><br>
echo db::field('news','title',8); <i>//输出：EQPHP本周用户关注度大幅提升</i><br><br>

<i>//查询用户账号为tom的邮箱：</i><br>
echo db::field('member','email','account="tom"'); <i>//输出：tom88@tom.com</i><br><br>

<i>//查询ID为10的帖子回复总数：</i><br>
echo db::field('bbs_reply','count(1)','subject_id=10'); <i>//输出：51</i>
</code><br><br>

3、查询数据表指定记录(线，返回一行)：<span class="fsb">db::rs('查询SQL语句')</span><br>
<code>
<i>//查询ID为32的会员基本信息：</i><br>
$query_field='nickname,age,address,sign';<br>
$user_info=db::rs(sql($query_field,'member','user_id=32'));<br>
print_r($user_info);<br>
<i>//输出结果：Array ( [nickname] => EQPHP [age] => 26 [address] => 古城长安 [sign] => EQPHP,一个神级框架！ )</i>
</code><br><br>

4、查询数据表多条记录(面，返回多行)：<span class="fsb">db::rs_list('查询SQL语句')</span><br>
<code>
<i>//查询年龄大于30岁的前20位女性会员的基本信息并按年龄降序排列：</i><br>
$option['select']='nickname,age,address,sign';<br>
$option['from']='user_info';<br>
$option['where']='sex=2 && age>30';<br>
$option['order']='age desc';<br>
$option['limit']='0,20';<br>
$user_info=db::rs_list(sql($option));<br>
var_dump($user_info);<br>
<i>//输出结果：<br>
array(2) {<br>
[0]=> array(5) { ["nickname"]=> string(5) "樱桃小妞" ["age"]=> int(36) ["address"]=> string(12) "古城长安" ["sign"]=> string(27) "只爱你" }<br>
[1]=> array(5) { ["nickname"]=> string(5) "mary" ["age"]=> int(31) ["address"]=> string(12) "北京王府井" ["sign"]=> string(27) "我就是一个吃货" }<br>
}</i>
</code><br><br>

5、分页查询(体，分批返回)：<span class="fsb">db::page_list('查询SQL语句','记录总数','页码','每页记录数')</span><br>
<code>
<i>//分页查询新闻列表：</i><br>
$option['select']='id,title,visited_num,pub_time';<br>
$option['from']='news';<br>
$option['where']='is_show=1';<br>
$option['order']='pub_time desc';<br><br>

$rs_count=db::field('news','count(1)',$option['where']);<br>
$news_list=db::page_list(sql($option),$rs_count,rq(3,1),20);<br>
out($news_list[1],1);<br>


<i>//输出结果：<br>
Array<br>
(<br>
　　[0] => Array<br>
　　　　(<br>
　　　　　　[id] => 74<br>
　　　　　　[title] => PHP开源MVC框架：EQPHP V1.0版本上线发布<br>
　　　　　　[visited_num] => 1237<br>
　　　　　　[pub_time] => 2013-10-24<br>
　　　　)<br><br>

　　[1] => Array<br>
　　　　(<br>
　　　　　　[id] => 69<br>
　　　　　　[title] => 关于mysql数据库分布式事务处理方案<br>
　　　　　　[visited_num] => 891<br>
　　　　　　[pub_time] => 2013-10-22<br>
　　　　)<br><br>

)<br></i>
</code><br><br>

三、数据记录操作（CURD-create/update/delete）-增加、修改、删除<br>
1、添加数据记录：<span class="fsb">db::add('表名','数据{字段=>值}')</span><br>
<code>
<i>//添加一条新闻：</i><br>
$data['title']='PHP开源MVC框架：EQPHP V1.0版本上线发布';<br>
$data['summary']='PHP开源MVC框架EQPHP,一个神级框架！';<br>
$data['author']='admin';<br>
$data['content']='PHP开源MVC框架：EQPHP V1.0版本上线发布,欢迎下载使用，求建议、求改进！';<br>
db::add('news',$data);<br><br>

<i>//添加2名同学的考试成绩：</i><br>
$field='(name,math,english,art,geography,physics,chemistry)';<br>
$data=array('("tom",98,100,86,75,85,68)','("lily",100,90,76,65,75,68)');<br>
db::add('news',$field,$data);<br>
</code><br><br>

2、修改数据记录：<span class="fsb">db::mod('表名','数据(字段=>值)','条件')</span><br>
<code>
<i>//修改ID为8的会员邮箱、电话、QQ号：</i><br>
$data['email']='example@126.com';<br>
$data['tel']='13654128745';<br>
$data['qq']='456987213';<br>
db::mod('member',$data,8);<br><br>

<i>//将工龄满5的女员工薪资加两成：</i><br>
db::mod('staff','salary=salary*1.2','sex=2 && work_years>=5');<br>
</code><br><br>

3、删除数据记录：<span class="fsb">db::del('表名','条件')</span><br>
<code>
<i>//删除ID为8的会员：</i><br>
db::del('member',8);<br><br>

<i>//删除选中新闻：</i><br>
db::del('news','id in(15,36,77,162,201)');<br>
</code><br><br>


四、事务操作（transaction）<br>
如若你的数据引擎(如mysql的innodb)支持事务，你可以如下使用：<br>
<code>
<i>//开启事务</i><br>
db::query('begin');<br><br>

<i>//执行sql语句</i><br>
$account=db::field('member','account',8);<br>
$result=db::add('news',$data);<br>
$news_list=db::rs_list(sql('news','id,title,author,pub_time','author='.$account));<br><br>

<i>//事务处理</i><br>
db::transaction($account && $result && $news_list);
</code><br><br>




五、构造SQL查询语句（SQL action）<br>
写出性能高效、可读性好、易维护又安全的SQL语句是大多数开发者不断追求的。然而，查询的多样性是的SQL语句千变万化，难有定律。<br>
EQPHP推荐使用多SQL（分步查询）+事务方式（将数据处理、整合留给php做，mysql只负责“拿”）代替复杂的联合查询。 SQL组装函数：db::sql($option,$from,$where)可以我们日常开发中80%左右的SQL查询，用法有如下两种方式：<br><br>


1、字符串参数：<span class="fsb">db::sql('查询字段','表名','条件')</span><br>
<code>
<i>//组装：select id,subject,info from bbs_subject where user_id=8</i><br>
db::sql('id,subject,info','bbs_subject','user_id='.session('id'));<br><br>

<i>//组装：select id,title,summary,content,pub_time from news</i><br>
db::sql('id,title,summary,content,pub_time','news');<br>
</code><br><br>

1、数组参数：<span class="fsb">db::sql($option)</span>数组的键：select/from/where/group/having/order/limit<br>
<code>
<i>//组装：select is_sure,count(id) as num from c_event where is_show=1 && company_id=12 group by is_sure</i><br>
$option['select']='is_sure,count(id) as num';<br>
$option['from']='c_event';<br>
$option['where']='is_show=1 && company_id=12';<br>
$option['group']='is_sure';<br>
db::sql($option);<br><br>



<i>//组装：select name,sum(sale) as sale_num from store_info where city_id in(1,15,31,52,47,21) group by name having sale_num>1500</i><br>
$option['select']='name,sum(sale) as sale_num';<br>
$option['from']='store_info';<br>
$option['where']='city_id in(1,15,31,52,47,21)';<br>
$option['group']='name';<br>
$option['having']='sale_num>1500';<br>
db::sql($option);<br>
</code><br><br>



<strong>多库操作</strong><br>

一、数据库连接配置，打开config/db_many.ini文件，配置如下：<br>
<code>
[db_0]<br>
names=utf8<br>
debug=on<br>
page_size=20<br><br>

[db_1]<br>
host=127.0.0.1<br>
user=root<br>
pwd=<br>
dbase=master<br><br>

[db_2]<br>
host=250.250.250.2:3306<br>
user=root<br>
pwd=<br>
dbase=eqphp
</code><br><br>

二、使用方法：<span class="fsb">db('数据库索引')->rs('SQL语句')</span> CURD方法与单库相同
<code>
<i>//从master库查询ID为8的会员账号</i><br>
echo db(1)->field('member','account',8); <i>输出：eqphp</i><br><br>

<i>从eqphp库查询最新5条新闻</i><br>
$this->master=db(2);<br>
$option['select']='id,title,pub_time,visited_num';<br>
$option['from']='news';<br>
$option['order']='pub_time desc';<br>
$option['limit']='0,5';<br>
$this->master->rs_list(sql($option));<br>
</code>

</p>


<h1>请求与响应（request & response）</h1>
<p><br>
<strong>pathinfo路由模式下接收GET传值</strong><br>
1、pathinfo实现：<br>
为了更好地优化url，EQPHP推荐使用pathinfo模式路由(如，http://www.eqphp.com/news/detail/32)，使用该路由模式需要完成下边三项：<br>
a、确保服务器支持url_rewrite,并开启，apache下开启方法为：修改httpd.conf文件的LoadModule rewrite_module modules/mod_rewrite.so<br>这一行为启用模式，或参照互联网上更多的方法。<br>
b、确保项目根目录下存在.htaccess文件，内容：<br>
<code>
#LoadModule rewrite_module modules/mod_rewrite.so<br>
RewriteEngine on<br>
RewriteCond $1 !^(index.php|favicon.ico|file|data|view|xhprof_html)<br>
RewriteRule ^(.*)$ /eqphp/index.php/$1 [L]<br>
</code>
c、发送pathinfo模式URL给服务器（控制器）。<br><br>

2、接收pathinfo模式下URL传值：<span class="fsb">rq('参数位置','参数类型')</span><br>
<code>
<i>比如获取如下URL（http://www.eqphp.com/news/detail/32）的新闻编号32：</i><br>
$news_id=rq(2,1);<br>
<i>//参数2 -- 32的位置，news为0，向后累加；<br>
//参数1 -- 接收int类型ID，若该位置为其它类型为自动转换成int类型，不存在返回null;</i><br><br>

<i>获取URL：http://www.eqphp.com/user/center/john中的john：</i><br>
$user_account=rq(2);

</code><br>

<strong>跳转、重定向</strong><br>
1、跳转：<span class="fsb">http::skip('目标URL片段');</span><br>
<code>
<i>//授权成功，跳转至后台管理首页：</i><br>
http::skip('admin/');<br><br>

<i>跳转至另一域名：</i><br>
header('location: http://bbs.eqphp.com/');<br>
exit;
</code><br><br>

2、重定向：<span class="fsb">http::redirect('目标URL','停留秒数','提示信息');</span><br>
<code>
<i>//5s后重定向到网站首页</i><br>
http::redirect(dc_url,5,'注销成功！');<br><br>

<i>//重定向至404</i><br>
http::send(404);
</code><br><br>



<strong>输出：string/script/json/xml</strong><br>
<code>
<i>//输出字符串:<b class="fsb">http::out('输出信息','是否发送头信息','是否终止脚本')</b></i><br>
http::out('Hello , EQPHP !');<br><br>

<i>//输出script脚本:<b class="fsb">http::script('脚本信息','脚本类型','是否终止脚本')</b></i><br>
http::script('密码错误!','alert');<br><br>


<i>//输出json数据:<b class="fsb">http::json('输出php数组','是否发送头信息','是否终止脚本')</b></i><br>
$tip_info=array('error'=>0,'info'=>'新闻发布成功！');<br>
http::json($tip_info); <i>//发送逻辑处理结果:</i><br><br>

$data=array(<br>
array('id'=>8,'title'=>'Mr Jim come to beijing','pub_time'=>'2013-10-08 12:12:05'),<br>
array('id'=>9,'title'=>'EQPHP V1.0版本上线发布','pub_time'=>'2013-10-18 15:11::10'),<br>
array('id'=>11,'title'=>'Jobs 逝世一周年纪念日，iphone4 大回馈','pub_time'=>'2013-10-18 15:11::10')<br>
);<br>
http::json($data); <i>//返回3条新闻给异步请求</i><br><br>


<i>//输出XML:<b class="fsb">http::xml('键值数组','是否发送头信息','是否终止脚本')</b></i><br>
$respose['begin']='received request, heartbeat begin';<br>
$respose['index']='heartbeating...';<br>
$respose['end']='this is the reply info: heartbeat end';<br>
http::xml($respose,'heartbeat_reply');<i>//回复接口协议数据</i>
</code><br><br>

<strong>curl（或socket）方式发送post请求：</strong><b class="fsb">http::curl[/socket]('请求URL','发送数据')</b><br>
确保服务器支持curl、socket并开启，以post方式发送请求，以json格式传输，返回数组。<br>
<code>
<i>//获取指定用户消息数</i><br>
$url=dc_root.'api/user/message/';<br>
$result=http::curl($url,'user_id=8');<br>
echo $result['new_num']; <i>//输出：3</i><br><br>

<i>//从指定接口获取用户基本信息：</i><br>
$url['scheme']='https';<br>
$url['host']='api.eqphp.com';<br>
$url['port']='8080';<br>
$url['path']='/user/center/info/';<br><br>

$data['account']='eqphp@126.com';<br>
$data['password']='!*EQPHP&#';<br><br>

$user_info=http::curl($url,$data);<br>
out($user_info,1);<br>
<i>
//输出结果：<br>
Array (<br>
　　[id] => 74<br>
　　[nickname] => 就是不告诉你<br>
　　[qq] => 123456987<br>
　　[tel] => 1326541***<br>
　)<br>
</i>
</code>
</p>


<h1>表单处理与数据安全（form & data security）</h1>
<p><br>
<strong>动态创建表单</strong><br>
<code>
<i>//表单开始：<b class="fsb">form::add('from','name','action','id|class','method|target')</b></i><br>
echo form::add('form','login','login','user_login|login','post|_self'); <i>//输出：<br>
&lt;form id="user_login" class="login" name="login" action="eqphp/login" method="post" target="_self"&gt;</i><br><br>

<i>//下拉列表：<b class="fsb">form::add('select','name','option','id|class','selected_option')</b></i><br>
$option=array('上海','北京','天津','重庆','西安','杭州');<br>
echo form::add('select','city',$option,null,'4'); <i>//输出：<br>
&lt;select id="city" class="city" name="city"&gt;<br>
&lt;option value="0"&gt;上海&lt;/option&gt;<br>
&lt;option value="1"&gt;北京&lt;/option&gt;<br>
&lt;option value="2"&gt;天津&lt;/option&gt;<br>
&lt;option value="3"&gt;重庆&lt;/option&gt;<br>
&lt;option value="4" selected&gt;西安&lt;/option&gt;<br>
&lt;option value="5"&gt;杭州&lt;/option&gt;<br>
&lt;/select&gt;</i><br><br>

<i>//复选框：<b class="fsb">form::add('checkbox','name','option','id|class','selected_option')</b></i><br>
$option=array('数学','语文','英语','化学','地理','历史');<br>
echo form::add('checkbox','subject',$option,null,'0|2|3|4');<i>//输出：<br>
&lt;input id="subject_0" class="subject" name="subject[]" type="checkbox" value="0" checked /&gt;数学<br>
&lt;input id="subject_1" class="subject" name="subject[]" type="checkbox" value="1" /&gt;语文<br>
&lt;input id="subject_2" class="subject" name="subject[]" type="checkbox" value="2" checked /&gt;英语<br>
&lt;input id="subject_3" class="subject" name="subject[]" type="checkbox" value="3" checked /&gt;化学<br>
&lt;input id="subject_4" class="subject" name="subject[]" type="checkbox" value="4" checked /&gt;地理<br>
&lt;input id="subject_5" class="subject" name="subject[]" type="checkbox" value="5" /&gt;历史<br>
</i><br><br>

<i>//单选按钮：<b class="fsb">form::add('radio','name','option','id|class','selected_option')</b></i><br>
$option=array('保密','男','女');<br>
echo form::add('radio','sex',$option,null,'1'); <i>//输出：<br>
&lt;input id="sex_0" class="sex" name="sex" type="radio" value="0" /&gt;保密<br>
&lt;input id="sex_1" class="sex" name="sex" type="radio" value="1" checked /&gt;男<br>
&lt;input id="sex_2" class="sex" name="sex" type="radio" value="2" /&gt;</i><br><br>

<i>//文本输入框-密码：<b class="fsb">form::add('text','name','value','id|class','size|maxlength|readonly')</b></i><br>
echo form::add('text','account','账号：','account|user','24|32|0'); <i>//输出：<br>
&lt;input id="account" class="user" name="account" type="text" value="账号：" size="24" maxlength="32" /&gt;</i><br>
echo form::add('password','pwd','密码：','pwd|user_pwd','24|32|0'); <i>//输出：<br>
&lt;input id="pwd" class="user_pwd" name="pwd" type="password" value="密码：" size="24" maxlength="32" /&gt;
</i><br><br>

<i>//隐藏域-文件域：<b class="fsb">form::add('file','name','value','id|class')</b></i><br>
echo form::add('hidden','begin_time','14:24:32',null); <i>//输出：<br>
&lt;input id="begin_time" class="begin_time" name="begin_time" type="hidden" value="14:24:32" /&gt;</i><br>
echo form::add('file','up_file','',null); <i>//输出：<br>
&lt;input id="up_file" class="up_file" name="up_file" type="file" value="" /&gt;
</i><br><br>

<i>//文本域：<b class="fsb">form::add('textarea','name','value','id|class')</b></i><br>
echo form::add('textarea','info','自我介绍：','info|textarea'); <i>//输出：<br>
&lt;textarea id="info" class="textarea" name="info"&gt;自我介绍：&lt;/textarea&gt;
</i><br><br>

<i>//按钮：<b class="fsb">form::add('submit','name','value','id|class')</b></i><br>
echo form::add('submit','login_submit','登录','login_btn|login_btn'); <i>//输出：<br>
&lt;input id="login_btn" class="login_btn" name="login_submit" type="submit" value="登录" /&gt;
</i><br>
echo form::add('reset','clear','重设','reset_btn|reset_btn'); <i>//输出：<br>
&lt;input id="reset_btn" class="reset_btn" name="clear" type="reset" value="重设" /&gt;
</i><br>
echo form::add('button','register','注册','reg_btn|reg_btn'); <i>//输出：<br>
&lt;input id="reg_btn" class="reg_btn" name="register" type="button" value="注册" /&gt;
</i><br><br>

<i>//验证码：<b class="fsb">form::add('img','check_name',null,'check_img|check_img')</b></i><br>
echo form::add('img','login',null,'login_img|login_img'); <i>//输出：<br>
&lt;img id="login_img" class="login_img" src="http://127.0.0.1/code/img/?check=login&r_num="<br>alt="看不清？点击更换" title="看不清？点击更换" onclick="this.src=this.src+Math.random();"&gt;</i><br><br>

<i>//表单结束：<b class="fsb">form::add('end')</b></i><br>
echo form::add('end'); <i>//输出：&lt;/form&gt;</i>
</code><br><br>


<strong>接收处理GET提交表单数据：form::get('提交项','接收类型')</strong><br>
提交相为表单项name值，接收类型可以是：request/isset/int/name/number/get<br>
<code>
echo form::get('submit','isset'); <i>//输出：1</i><br>
echo form::get('age','int'); <i>//输出：24</i><br>
echo form::get('account','name'); <i>//输出：eqphp</i><br>
echo form::get('price','number'); <i>//输出：3.50</i><br>
echo form::get('content','get'); <i>//输出：&lt;b&gt;哈哈&lt;/b&gt;</i><br>
echo form::get('code','request'); <i>//输出：5f4h</i><br>
</code><br><br>


<strong>接收处理POST提交表单数据：form::post('提交项','接收类型')</strong><br>
提交相为表单项name值，接收类型可以是：tip/title/int/info/text/number/float/account/isset/arr_str/post<br>
<code>
echo form::post('submit','isset'); <i>//输出：1</i><br>
echo form::post('title','title'); <i>//输出：这是一条新闻标题</i><br>
echo form::post('hit','int'); <i>//输出：325</i><br>
echo form::post('summary','info'); <i>//输出：新闻摘要</i><br>
echo form::post('content','text'); <i>//输出：新闻内容</i><br>
echo form::post('attention','number'); <i>//输出：1.55</i><br>
echo form::post('down_money','float'); <i>//输出：55.9</i><br>
echo form::post('author','account'); <i>//输出：admin</i><br>
echo form::post('tags','arr_str'); <i>//输出：EQPHP|MVC框架|神级框架</i><br>
echo form::post('content','post'); <i>//输出：&lt;b&gt;哈哈，不错！&lt;/b&gt;</i><br><br>

<i>//批量接收过滤</i><br>
$data=array('title'=>'title','hit'=>'int','content'=>'text',<br>
'author'=>'account','tags'=>'arr_str');<br>
$data=form::filter($data);

</code><br><br>


<strong>数据验证：form::check('数据','验证表达式','验证规则')</strong><br>
<code>
echo form::check($data['sex'],array(0,1,2),'in'); <i>//输出：1</i><br>
echo form::check($data['age'],'1,110','notbetween'); <i>//输出：0</i><br>
echo form::check($check_code,'4f5d','equal'); <i>//输出：1</i><br>
echo form::check($data['comment'],'5,200','length'); <i>//输出：1</i><br>
echo form::check($data['get_prize_time'],'2013-10-15,2013-10-31','expire'); <i>//输出：0</i><br>
echo form::check($data['email'],'email','regex'); <i>//输出：1</i>
</code><br><br>

<strong>数据验证并提示结果：form::check_tip('数据','验证表达式','验证规则','提示信息')</strong><br>
<span class="fcyy fsb">Tip：</span>提示信息格式为数组返回json-异步；字符窜则以警告框形式提示。<br>
<code>
$tip_info='请将输入内容保持在5~200字之间！';<br>
form::check_tip($data['comment'],'5,200','length',$tip_info);<br>
<i>//输出(警告框)：alert('请将输入内容保持在5~200字之间！')</i><br><br>

$tip_info=array('error'=>1,'info'=>'邮箱格式错误');<br>
form::check_tip($data['email'],'email','regex',$tip_info);<br>
<i>//输出(json)：{"error":1,"info":"\u90ae\u7bb1\u683c\u5f0f\u9519\u8bef"}</i><br>
</code>
</p>



<h1>文件操作、上传（file & upload）</h1>
<p><br>
<strong>文件、目录操作</strong><br>
<code>
<i>//创建目录：<b class="fsb">file::folder('目录路径','权限')</b><br>
//在dc_cache_php目录下递归创建年、月、日子目录：</i><br>
$new_dir=date('y').'/'.date('m').'/'.date('d');<br>
file::folder(dc_cache_php.$new_dir,0751); <br><br>

<i>//删除目录：<b class="fsb">file::del('目录路径','是否删除自身')</b><br>
//删除dc_cache_php目录下的所有文件和目录：</i><br>
file::del(dc_cache_php,false); <br><br>

<i>//修改目录/文件的权限、属主、所属分组：<b class="fsb">file::mod('目录路径','执行动作','目标值')</b><br>
//修改dc_cache_php目录下的所有文件和目录权限均为775，属主为apache，分组为root：</i><br>
file::mod(dc_cache_php,'chmod',0775); <br>
file::mod(dc_cache_php,'chown','apache'); <br>
file::mod(dc_cache_php,'chgrp','root'); <br><br>


<i>//目录、文件查找遍历：<b class="fsb">file::scan('目录路径','文件扩展名','文件清单')</b><br>
//列出dc_log_sql目录下的日志文件：</i><br>
file::scan(dc_log_sql,'log',$data); <br>
out($data,1); <i>//输出：<br>
Array　(<br>
　[0] => G:\wamp\www\eqphp\log\sql\2013_09_19_s.log<br>
　[1] => G:\wamp\www\eqphp\log\sql\2013_09_20_s.log<br>
　[2] => G:\wamp\www\eqphp\log\sql\2013_09_21_s.log<br>
　[3] => G:\wamp\www\eqphp\log\sql\2013_09_23_s.log<br>
)
</i><br><br>

<i>//写文件：<b class="fsb">file::save('文件名称',文件内容','读写模式')</b>，读写模式请参照手册<br>
//在dc_log_log目录下创建test.log，并写入“这是一一个测试文件。”：</i><br>
file::save(dc_log_log.'test.log','这是一一个测试文件。');
</code>

</p>


<h1>cookie与session</h1>
<p><br>
<strong>cookie</strong><br>

<code>
<i>//设置cookie：<b class="fsb">cookie::set('名称','值','周期','名称是否加密')</b></i><br>
cookie::set('follow_channel','cctv6');<br><br>


<i>//获取cookie：<b class="fsb">cookie::get('名称','名称是否加密')</b></i><br>
echo cookie::get('follow_channel'); <i>//输出：cctv6</i>
</code>
<span class="fcyy">Tip：</span>cookie名称加密后，前端script难以获取，慎用！
<br><br>



<strong>session</strong><br>
1、session相关环境配置：<span class="fsb">s_system::init()</span><br>
<code>
<i>//设置session存放方式：文件/数据库/内存(memchached)</i><br>
ini_set('session.save_handler','files'); <i>//DB-user/memcache-memcached</i><br><br>

<i>//设置session存放位置：文件/内存(memchached)</i><br>
session_save_path(dc_cache_session); <i>//memcache-127.0.0.1:11211</i><br><br>

<i>//设置session作用的域名范围：</i><br>
ini_set('session.cookie_domain','eqphp.com'); <br><br>

<i>//开启session</i><br>
session_start();
</code><br><br>

2、session存取(file)<br>
<code>
<i>//设置session：<b class="fsb">session::set('名称','值')</b></i><br>
session::set('id',8);<br>
$user_info=array('id'=>8,'account'=>'eqphp','access'=>'1|2|3|5|8');<br>
session::set('user_info',$user_info);<br><br>

<i>//K-V数组批量设置：<b class="fsb">session::set($data)</b></i><br>
$data['id']=8;<br>
$data['account']='eqphp';<br>
$data['access']='1|2|3|5|8';<br>
$data['email']='example@126.com';<br>
session::set($data);<br><br>

<i>//获取session：<b class="fsb">session::get('名称','是否立即卸载')</b></i><br>
echo session::get('email'); <i>//输出：example@126.com</i><br>
echo session::get('login_code',true); <i>//输出：5f6d</i><br><br>

<i>//卸载session：<b class="fsb">session::clear('名称')</b></i><br>
session::clear('email'); <i>//删除email</i><br>
session::clear(null); <i>//清空所有session</i>
</code><br><br>

3、session的简洁用法：<b class="fsb">session('名称','值')</b><br>
<code>
session(null); <i>//清空所有session</i><br>
session($data); <i>//K-V数组批量设置session</i><br>
session($key,true); <i>//获取$key的session后并卸载$key</i><br>
session($key,$value); <i>//设置session</i><br>
session($key,null); <i>//卸载$key的session</i><br>
session($key); <i>//获取session</i><br>
</code>
</p>





<h1>缓存与静态化(cache & static)</h1>
<p><br>
<strong>缓存(cache)</strong><br>
缓存这一古老话题，对每个做web应用的人来说再熟悉不过了，PHP缓存大致分为编译缓存和数据缓存。对解释性语言PHP来说，编译缓存可以大幅提升产品性能，常用的OPcode缓存技术有：Xcache、APC、Accelerator等，对开发人员来说不需要做太多工作，只需要运维人员在服务器上安装相应环境配置即可。<br>
数据缓存，根据存放位置不同可分为内存级缓存和硬盘缓存。<br><br>
一、内存级缓存,由于内存大小有限，资源珍贵，而且性能也比硬盘存取快很多，一般应用对重要数据资源进行内存缓存。目前技术主要有memcache和Redis，接下来重点说说K-V特色的memcache缓存，废话不多说，直接看用法：<br>
1、简单应用：确保服务端配置好memcache，打开config/memcache.ini文件：<br>
<code>
[memcache]<br>
host=localhost<br>
port=11211<br>
</code><br>
代码中这样写：<br>
<code>
<i>//获取一个memcache实例：</i><br>
$memcache=s_memcache::one();<br><br>

<i>//设置：<b class="fsb">$memcache->set('键名','值','压缩模式','周期')</b></i><br>
<i>//将EQPHP无压缩(MEMCACHE_COMPRESSED,zlib压缩)下缓存300秒(0,永久(不超过30天))</i><br>
$memcache->set('memcache','EQPHP',0,300);<br>
$memcache->set('version','1.0',0,0);<br><br>

<i>//修改：<b class="fsb">$memcache->replace('欲替换键名','新值','压缩模式','周期')</b></i><br>
$memcache->replace('memcache','EQPHP is a PHP framework!',0,300);<br><br>

<i>//删除：<b class="fsb">$memcache->delete('键名','删除周期')</b></i><br>
$memcache->delete('memcache',10); <i>//10s内(0,立即)删除memcache</i><br><br>


<i>//获取：<b class="fsb">$memcache->get('键名')</b></i><br>
echo $memcache->get('version'); <i>//输出：1.0</i>
</code><br>
2、memcache集群，打开config/memcache.ini文件：weight,命中比重<br>
<code>
[mc0]<br>
host=localhost<br>
port=11211<br>
weight=40<br><br>

[mc1]<br>
host=192.168.0.5<br>
port=11211<br>
weight=30<br><br>

[mc2]<br>
host=192.168.0.111<br>
port=11212<br>
weight=30
</code><br>
用法除了获取memcache实例之外和简单应用相同<br>
<code>
<i>//获取一个memcache实例：</i><br>
$memcache=s_memcache::many(); <i>//也可用简写方法mc()</i><br><br>

<i>//用法</i><br>
$memcache->set('version','1.0',0,0);<br>
$memcache->replace('memcache','EQPHP is a PHP framework!',0,300);<br>
$memcache->delete('memcache',10); <i>//10s内(0,立即)删除memcache</i><br>
$memcachee->get('version'); <i>//输出：1.0</i>
</code><br>



二、硬盘缓存（文件缓存），分为时间触发缓存、内容触发缓存、永久缓存（静态化）<br>

<code>
<i>//实例化一个cache对象：<b class="fsb">factory('cache',array('文件名','目录','缓存周期'))</b>，周期为0则缓存3年</i><br>
$cache=factory('cache',array('8.php','user_info',60));<br><br>

<i>//缓存数据：<b class="fsb">$cache->save($data)</b></i><br>
$data=array(<br>
　'id'=>8,<br>
　'title'=>'EQPHP V1.0版本上线发布',<br>
　'info'=>'EQPHP V1.0版本上线发布，敬请下载使用。',<br>
　'pub_time'=>'2013-10-18 15:11::10'<br>
);<br>
$cache->save($data);　<i>//cache/db/php/user_info/目录下生成缓存文件（确保目录可写）</i><br><br>

<i>//获取数据：<b class="fsb">$cache->get()</b></i><br>
$user_info=$cache->get();<br>
out($user_info); <i>//60s内会输出上边的$data结果，超过输出null</i><br><br>

<i>//删除数据：<b class="fsb">$cache->clear('[是否删除目录]')</b></i><br>
$cache->clear(); <i>//删除生成的php文件</i><br>
$cache->clear(true); <i>//连同user_info目录一起删除</i>
</code><br>
<span class="fcyy">Tip：</span> 根据文件扩展名(txt/php/ini/js/xml)可以缓存成纯文本数据、php数组、配置文件、json数据、xml数据；<br>
　　　如果将数据缓存为txt文件，获取时加参数true，即：$data=$cache->get(true)；<br>
　　　如果缓存为ini文件，必须是带有键名的二维数组，加键名获取某一项，不加获取所有，即：$data=$cache->get('键名')。<br><br>


<strong>静态化(static)</strong><br>
将长期无变化的数据直接生成静态网页也是很有必要的，或者保存为json数据直接供前端使用也是一种不错的优化方式。<br>
<code>
<i>//生成静态网页：<b class="fsb">create::html('URL','静态网页名','存储目录')</b></i><br>
$url=dc_url.'news/detail/5';<br>
create::html($url,'5.html','news');<br><br>

<i>//生成json数据：<b class="fsb">create::json('数据','文件名','存储目录')</b></i><br>
$data=array(<br>
　'id'=>8,<br>
　'title'=>'EQPHP V1.0版本上线发布',<br>
　'info'=>'EQPHP V1.0版本上线发布，敬请下载使用。'<br>
);<br>
create::json($data,'8.js','news');
</code><br>
<span class="fcyy">Tip：</span>上述生成html方法不能用于有session(或cookie)验证的页面。
</p>

<h1>加密、图像、邮件(encrypt/image/mail)</h1>
<p><br>
<strong>邮件(mail)</strong><br>
1、配置邮件参数,打开config/mail.ini<br>
<code>
[mail]<br>
host=smtp.126.com<br>
port=25<br>
user=example<br>
pwd=123456***<br>
from=example@126.com<br>
<i>;是否开启日志</i><br>
is_log=off

</code><br>

2、发送邮件：<span class="fsb">mail::send('收件邮箱','主题','内容')</span><br>
<code>
<i>//单发：</i><br>
mail::send('123456789@qq.com','EQPHP问候','您好，EQPHP向你问好！');<br><br>

<i>//群发：用英文逗号隔开邮箱</i><br>
mail::send('123789@qq.com,abcde@tom.com,good@126.com','EQPHP问候','您好，EQPHP向您问好！');
</code><br>

3、使用邮件模板：<span class="fsb">mail::tpl('模板名称','邮件主题','邮件内容')</span><br>
<code>
<i>//用法如下：</i><br>
$tpl=dc_view_tpl.'register_activate.html';<br>
$user_email='example@126.com';<br>
$activate_code=md5($user_email.time());<br>
$data=array(<br>
array('/{site_name}/','/{user_email}/','/{reg_url}/','/{email_code}/'),<br>
array('EQPHP开源社区',$user_email,dc_url.'register/activate/',$activate_code)<br>
);<br>
mail::tpl($tpl,$data,$title,$content);<br>
mail::send($user_email,$title,$content);
</code><br>

模板内容：register_activate.html<br>
<code>
&lt;title&gt;{site_name}email认证激活&lt;/title&gt;<br>
&lt;body&gt;&lt;br&gt;邮箱为{user_email}的朋友：&lt;br&gt;&lt;br&gt;<br>
欢迎加入{site_name}!&lt;br&gt;&lt;br&gt;<br>
请点击下面的链接完成注册：&lt;br&gt;&lt;br&gt;<br>
&lt;a href="{reg_url}{email_code}" target="_blank"&gt;{reg_url}{email_code}&lt;/a&gt;&lt;br&gt;&lt;br&gt;<br>
如果以上链接无法点击，请将上面的地址复制到你的浏览器(如IE)的地址栏进入{site_name}。&lt;br&gt;&lt;br&gt;&lt;br&gt;<br>
--{site_name}&lt;br&gt;&lt;br&gt;(这是一封自动产生的email，请勿回复。)&lt;br&gt;&lt;br&gt;&lt;/body&gt;<br>
</code><br>

<strong>图像(image)</strong><br>
图像的基本操作（创建、打开、样式风格、绘制、填充、文本、旋转、复制合并、滤镜、输出、清理等）请参照工具类img。<br>
以下几种常用技术：生成验证码、添加水印、指定尺寸缩放（缩略图）、生成用户图像。<br>

1、生成验证码：<span class="fsb">pic::code('验证字符','宽','高','字体大小')</span><br>
<code>
$check_code=s_extend::code(4);<br>
pic::code($check_code); <i>//效果如下图：</i><br>
</code><br><img src="images/example_check_code.gif"><br><br>

2、为图片添加水印：<span class="fsb">pic::mark('图片名称','水印字符','保存参数')</span><br>
<code>
$picture=dc_file_create.'example.jpg';<br>
$mark_info=array('http://www.eqphp.com','艺青科技');<br>
$save_param=array('eqphp_create_mar.jpg',dc_file_create);<br>
pic::mark($picture,$mark_info,$save_param); <i>//水印效果如下图：</i><br>
</code><br><img src="images/pic_create_mark.png"><br><br>

3、按照指定尺寸缩放图片：<span class="fsb">pic::zoom('图片名称','保存参数','尺寸','是否为高')</span><br>
<code>
<i>//将533px*800px的example.jpg等比例缩放为宽240px的pic_example_zoom.jpg</i>
$picture=dc_file_create.'example.jpg';<br>
$save_param=array('pic_example_zoom.jpg',dc_file_create);<br>
pic::zoom($picture,$save_param,240);
</code><br>

4、生成指定尺寸的用户头像：<span class="fsb">pic::avatar('图片名称','尺寸数据,'存放目录')</span><br>
<code>
$picture=dc_file_create.'example_avarat.png';<br>
$size_data=array(100,75,50,32);<br>
pic::avatar($picture,$size_data,dc_file_create);<i>//效果如下图：</i><br>
</code><br>
<img src="images/example_avarat_100.gif">&nbsp;
<img src="images/example_avarat_75.gif">&nbsp;
<img src="images/example_avarat_50.gif">&nbsp;
<img src="images/example_avarat_32.gif">&nbsp;<br><br>


<strong>加密-解密(encrypt-decode)</strong><br>
开发中，有些敏感数据需要保护起来，比如银行卡号、个人隐私等。<br>
1、加密：<span class="fsb">safe::encode('待加密数据','密钥')</span><br>
<code>
echo safe::encode('我的银行卡号是：61247858756434478','753951'); <i>//输出：<br>e=gzN0QzM0c0YTN3gTN2f4cDNyEjNf7ay77vip51c3+Y5h2Y55dMGK62OZc1885bf37cace74a886a65eEq55Rio50</i>
</code><br>

2、解密：<span class="fsb">safe::decode('待解密数据','密钥')</span><br>
<code>
$text='e=gzN0QzM0c0YTN3gTN2f4cDNyEjNf7ay77vip51c3+Y5h2Y55dMGK62OZc1885bf37cace74a886a65eEq55Rio50';<br>
echo safe::decode($text,'753951'); <i>//输出：我的银行卡号是：61247858756434478</i>
</code><br>

<span class="fcyy">Tip：</span>加密、解密甚耗资源，尤其是加密后数据体积2-5倍增加（越小倍数越大），请酌情使用。<br><br>
</p>



<h1>日志、性能、错误调试(log/debug)</h1>
<p><br>
<strong>性能、错误调试(debug)</strong><br>
1、打印变量：<span class="fsb">debug::out('打印句柄','输出模式','是否终止脚本')</span><br>
<code>
$num=12.48;<br>
$user_info=array('id'=>10,'account'=>'admin','level'=>9);<br>
$cache=factory('cache',array('out.txt',date('Y-m'),1200));<br><br>

debug::out($num); <i>//输出（第二个参数默认为0-var_dump）：float(12.48)</i><br>
debug::out($user_info,1); <i>//输出（参数1-print_r）：<br>
Array<br>
(<br>
　[id] => 10<br>
　[account] => admin<br>
　[level] => 9<br>
)
</i><br>

debug::out($user_info,2); <i>//输出（参数2-var_export）：<br>
array (<br>
　'id' => 10,<br>
　'account' => 'admin',<br>
　'level' => 9,<br>
)
</i><br>

debug::out($cache,0,true); <i>//输出（参数true表示脚本继续执行）：<br>
object(cache)#1 (5) {<br>
　["custom_dir":"cache":private]=><br>
　string(12) "txt/2013-10/"<br>
　["save_dir":"cache":private]=><br>
　string(39) "G:\wamp\www\eqphp/cache/db/txt/2013-10/"<br>
　["file_name":"cache":private]=><br>
　string(75) "G:\wamp\www\eqphp/cache/db/txt/2013-10/84a74c5f187659bbb84494c039873807.txt"<br>
　["ext":"cache":private]=><br>
　string(3) "txt"<br>
　["valid":"cache":private]=><br>
　int(1200)<br>
}
</i><br>
</code><br>

2、查看系统信息：<span class="fsb">debug::info('类型参数')</span><br>
类型参数：array('basic','const','variable','function','class','interface','file')<br>
<code>
out(debug::info(0),1); <i>//输出（环境基本参数）：<br>
Array<br>
(<br>
　[system] => Windows NT ACER-PC 6.1 build 7601 ((null) Service Pack 1) i586<br>
　[service] => apache2handler<br>
　[php_version] => 5.3.0<br>
　[frame_name] => eqphp<br>
　[frame_version] => 1.0<br>
　[magic_quotes] => 0<br>
　[time_zone] => PRC<br>
)
</i><br>

out(debug::info(1),1); <i>//输出（自定义常量）：<br>
Array<br>
(<br>
　[dc_root] => G:\wamp\www\eqphp/<br>
　[dc_url] => http://127.0.0.1/eqphp/<br>
　[dc_uri] => http://127.0.0.1/eqphp/son/<br>
　[dc_request] => eqphp/son<br>
　[dc_domain] => 127.0.0.1<br>
　[dc_basic_config] => G:\wamp\www\eqphp/config/<br>
　[dc_basic_class] => G:\wamp\www\eqphp/class/<br>
　[dc_basic_plugin] => G:\wamp\www\eqphp/plugin/<br>
　……<br>
)
</i><br>

out(debug::info('file'),1); <i>//输出（引用加载文件）：<br>
Array<br>
(<br>
　[0] => G:\wamp\www\eqphp\index.php<br>
　[1] => G:\wamp\www\eqphp\server\function_lib.php<br>
　[2] => G:\wamp\www\eqphp\server\s_system.php<br>
　[3] => G:\wamp\www\eqphp\action\a_son.php<br>
　[4] => G:\wamp\www\eqphp\action\a_pop.php<br>
　[5] => G:\wamp\www\eqphp\class\debug.php<br>
)
</i><br>
</code><br>

3、查看内耗-内存使用、耗时：<span class="fsb">debug::set_flag()、debug::used('起点','终点')</span>
<code>
$begin=debug::set_flag(); <i>//起点</i><br>
http::out('Hello world !',true,false);<br>
…… code …… <i>//待测试代码</i><br>
$end=debug::set_flag(); <i>//终点</i><br>
$result=debug::used($begin,$end); <i>//计算内耗</i><br>
out($result,1); <i>//输出（耗时、内存、内存峰值）：<br>
Array<br>
(<br>
　[0] => 0.002s<br>
　[1] => 334.438kb<br>
　[2] => 4325.875kb<br>
)
</i><br>
</code><br>

4、使用xhprof插件：<span class="fsb">xhprof_enable()、xhprof_disable()、debug::xhprof('结果数据','生成报告名')</span>
<code>
xhprof_enable(); <i>//开启</i><br>
http::out('Hello world !',true,false);<br>
…… code …… <i>//待测试代码</i><br>
$data=xhprof_disable(); <i>//获取数据包</i><br>
echo debug::xhprof($data,'xhprof_test'); <i>//显示xhprof测试结果 :</i>
</code><br>
<img src="images/xhprof_href.gif"><br>点击XHPROF_RESULT，<br><br>
<img src="images/xhprof_result.gif"><br><br>点击[View Full Callgraph]，<br>
<img src="images/xhprof_result_pic.gif"><br><br>


<strong>日志(log)</strong><br>
实际开发运营中，我们需要了解系统的运行状态、性能，以便我们及时作出处理决策，使系统继续保持良好的运行势态，这时记录日志和分析日志就显得相当重要。<br>
EQPHP根据使用经验将日志分为异常日志（错误、警告等）和轨迹日志（SQL、访问记录等）。可使用写文件函数file::save()，也可在log类里自行定义封装。<br>
1、异常、日志开启与关闭配置：log.ini<br>
<code>
[exception]<br>
mysql_connect=on<br>
mysql_select=on<br>
sql_error=on<br>
mail=on<br>
memcache=on<br><br>

[log]<br>
mysql_sql=on<br>
mail=on<br>

</code><br><br>

2、异常、错误记录方法：<span class="fsb">log::exception('异常分类(日志名)','记录内容')</span>
<code>
log::exception('mysql',mysql_error()); <i>//记录SQL语句执行错误</i><br><br>

<i>//自定义异常、错误方法：</i><br>
log::memcache($host,$port); <i>//memcache异常、错误</i>
</code><br><br>

3、自定义日志记录方法
<code>
<i>//记录SQL语句：log::sql($sql,$is_read)</i><br>
log::sql("insert into test (name,info) values ('test','test ok!')",false);<br><br>

<i>//也可直接使用file::save('日志名','内容','记录模式')</i><br>
$file=dc_log_test.'test.sql';<br>
$info=date('Y-m-d H:i:s').'log test';<br>
file::save($file,$info,'a+');
</code>
</p>
</div>




<div class="foot">
<span class="fs15 fal"><a href="http://www.eqphp.com/">EQPHP</a>  ·  版权所有 © 2012-2015</span>
<span class="far">制作: art-youth  ·  版本: 1.0</span>
</div>




</div></body></html>